package ocio.services;


import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import com.opensymphony.xwork2.Action;
import ocio.actions.AddProveedorAction;
import ocio.actions.ModificarProveedorAction;
import ocio.beans.Proveedor;
import ocio.dao.ProveedoresDao;

/**
 * Clase encargada de ofrecer la lógica de negocio asociada a la clase Proveedor.
 * Ofrece funciones CRUD para la gestión de proveedores.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Proveedor
 * @see ocio.services.ServiceIF
 */
@SuppressWarnings("all")
public class ProveedorService implements ServiceIF {

	ProveedoresDao proveedorDao;
	
	public ProveedorService (){
		proveedorDao = new ProveedoresDao();
	}
	
	/**
	 * Solicita que se añada un proveedor con los datos introducidos
	 * por el mismo proveefor o por el administrador y recogidos en objeto de la clase Action.
	 * @param form objeto de la clase Action con los datos del proveedor.
	 */
	@Override
	public boolean add(Action form) {	
		Proveedor p = new Proveedor();
		AddProveedorAction pform = (AddProveedorAction) form;
		p.setCorreo(pform.getCorreo());
		if (proveedorDao.findByExample(p).size()==0) {  //A�adir proveedor
			p.setNombre(pform.getNombre());
			p.setNif(pform.getNif());
			p.setPassword(pform.getPassword());
			p.setRol(pform.getRol());
			p.setTelefono(pform.getTelefono());
			p.setBaja(false);
			p.setFechabaja(null);
			proveedorDao.attachDirty(p);
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * Solicita la lista de todos los proveedores que cumplan con los requisitos
	 * introducidos en un formulario y recogidos en un objeto de la clase Action
	 * @param form objeto de la clase Action con los criterios de búsqueda.
	 * @return listaProveedores Lista de todos los proveedores que cumplen los criterios de búsqueda.
	 */
	public List<Object> searchByFields(Action form){

		List<Object> resul = new ArrayList<Object>();
		List<Proveedor> listaProveedores = new ArrayList<Proveedor>();
		Proveedor p = new Proveedor();
		AddProveedorAction pform = (AddProveedorAction) form;
				
		p.setCorreo(pform.getCorreo());
		p.setNif(pform.getNif());
		p.setPassword(pform.getPassword());
		p.setRol(pform.getRol());
		p.setTelefono(pform.getTelefono());
		p.setTipo(pform.getTipo());

		listaProveedores = proveedorDao.findByExample(p);	
	    Iterator itr = listaProveedores.iterator();
	    while(itr.hasNext()) {
	         Object element = itr.next();
	         resul.add(element);
	    }		
	    return resul;
		
	}   

	/**
	 * Solicita la lista de todos los proveedores de la base de datos.
	 * @return listaProveedores Lista de todos los proveedores de la base de datos.
	 */
	public List<Proveedor> ListAllProveedores(){

		List<Proveedor> listaProveedores = new ArrayList<Proveedor>();
		listaProveedores = proveedorDao.getAll();			
	    return listaProveedores;
		
	}

	/**
	 * Actualiza los datos del porveedore en función de los campos introducidos.
	 * por él mismo o por el administrador y recogidos en objeto de la clase Action
	 * @param form objeto de la clase Action con los datos del proveedor.
	 */
	@Override
	public void update(Action form) {

		Proveedor p = new Proveedor();
		ModificarProveedorAction pform = (ModificarProveedorAction) form;
		p=proveedorDao.findById(pform.getId());
		//Correo, campo que no se debe modificar.
		p.setNombre(pform.getNombre());
		p.setNif(pform.getNif());
		if(pform.getPassword().length()!=0){
			p.setPassword(pform.getPassword());
		}
		p.setTelefono(pform.getTelefono());
		//El tipo NO se puede modificar
		proveedorDao.attachDirty(p);
	}

	/**
	 * Búsqueda de proveedor por identificador.
	 * @param id identifificador en la base de datos del proveedor.
	 * @return p Objeto correspondiente al proveedor con el identificador dado.
	 */
	public Object searchById(int id){
		Proveedor p;
		p = proveedorDao.findById(id);
		return p;
	}

	/**
	 * Solicita lista de todos los proveedores que tengan en su nombre una cadena de texto dada
	 * @return listaProveedores Lista de todos los proveedores con una cadena de texto en su nombre.
	 */
	public List<Object> searchByNombre(String cadena){
		List<Object> resul = new ArrayList<Object>();
		List<Proveedor> listaProveedores = new ArrayList<Proveedor>();
		listaProveedores = proveedorDao.findByLike(cadena);	
	    Iterator itr = listaProveedores.iterator();
	    while(itr.hasNext()) {
	         Object element = itr.next();
	         resul.add(element);
	    }		
	    return resul;
	}

	/**
	 * Borra el proveedor.
	 * @param o Objeto correspondiente al proveedor que se quiere borrar.
	 */
	@Override
	public void delete(Object o) {
		Proveedor p;
		Date fecha= new Date();
		
		p = (Proveedor)o;
		p.setBaja(true);
		p.setFechabaja(fecha);
		//hacemos baja lógica, no física
		//se pone baja=true y se guarda la fecha de baja
		//proveedorDao.delete(p);
		proveedorDao.attachDirty(p);
	}

}
